﻿using System;
using System.Threading;
using Exchange;
using Nau.Airplane.Speech;
using Nau.Parametrizer;
using System.Windows.Forms;

// Эта программа демонстрирует использование коммуникатора для приема данных от центральной машины 
// авиационного тренажера TL410 НАУ. 
//
namespace RepeaterService
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            Random r = new Random();
            Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(Program_UnhandledException);
            
            // Создаем экземпляр коммуникатора, который будет обеспечивать прием пакетов, 
            // анализ и хранение значений параметров
            // указываем конструктору адреса и порты местной и удаленной машины
           // Communicator Communicator = new Communicator("192.168.223.78", 4001, "192.168.223.78", 4000 );
            Communicator communicator = new Communicator("127.0.0.1", 4001, "127.0.0.1", 4000);

            Console.WriteLine("Start listening to model? (y/n)");
            if (Console.ReadLine() == "y")
            {
                Console.WriteLine("Initializing communicator...");
                
                // Коммуникатор будет искать в пакетах только те параметры, которые у него зарегистрирует программа.
                // Например, добавляем параметр с названием "COURSE". Все входные параметры будут "input"
                communicator.AddParameter("100", "COURSE", ParameterDirection.Input, 13);
                
                // Запускаем коммуникатор. Прием параметров будет осуществлятся в отдельном потоке, независимо от 
                // прикладной программы.
                communicator.Start();
                
                // В процессе работы коммуникатора можно добавлять параметры. (Удалять пока нельзя)
                communicator.AddParameter("110","SPEED", ParameterDirection.Input, 13);          
            }

            Parameters parameters = new Parameters();
            //Серіалізатор
            Serializer serializer = new Serializer();
            //Десеріалізуємо список параметрів
            parameters = serializer.DeSerializeObject(Application.StartupPath.Replace("\\Nau.Airplane.StepperEngineRepeater\\RepeaterService\\bin\\Debug", "") + "\\Parameters.prm");
            //Додаємо цей список в комунікатор
            foreach (var item in parameters.ParameterList)
            {
                i++;
                communicator.AddParameter(i.ToString(), item.Name, item.Direction, r.Next(1,10));
            }
            //Вспомагательная переменная для вывода сообщения с наивысшим приоритетом
            Parameter toPlay;
            
            // Главная программа каждые 2 секунды берет из хранилища коммуникатора атрибуты принятых параметров и выводит в консоль
            while (true)
            {
                //Console.Clear();
                Thread.Sleep(2000);
                //Проходимося по всім елементам комунікатора
                foreach (Parameter item in communicator.Parameters)
                {
                    // Проверка списка сообщения на наличие клонов
                    if (communicator.CheckParametersID(item)) break;

                    // определяем сообщение с наивысшим приоритетом
                    toPlay = item;
                    toPlay = communicator.ChooseToPlay(toPlay);

                    if (!String.IsNullOrEmpty(toPlay.Value))
                    {
                        if (!String.IsNullOrEmpty(toPlay.Value.Trim()))
                        {
                            if (toPlay.NeedPlay)
                            {
                                //озвучуємо прийняте повідомлення
                                Nau.Airplane.Speech.SpeechHelper.PlayString(toPlay.Value);
                                //виводимо прийняте повідомлення
                                Console.Write("{0} = {1};", toPlay.Name, toPlay.Value);
                                toPlay.NeedPlay = false;
                                break;
                            }
                        }
                        else
                        {
                            var ItemInParameteres = parameters.ParameterList.Find(t => t.Name == toPlay.Name);
                            if (ItemInParameteres != null)
                            {
                                if (toPlay.NeedPlay)
                                {
                                    //Озвучуємо отримане повідомлення
                                    Nau.Airplane.Speech.SpeechHelper.PlayString(ItemInParameteres.ValueString);
                                    //Виводимо отримане повідомлення
                                    Console.Write("{0} = {1};", ItemInParameteres.Name, ItemInParameteres.ValueString);
                                    toPlay.NeedPlay = false;
                                    break;
                                }
                            }
                        }
                    }
                    //Console.Write("{0} = {1};", item.Name, item.Value);
                        
                }
            }
        }

        private static void Program_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Console.WriteLine(((Exception)e.ExceptionObject).Message );
        }
           
    }
}
